/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	IBOrganizationMgr.java
 * 模块说明：	
 * 修改历史：
 * 2006-4-28 - lxm - 创建。
 */
package com.hd123.rumba.organization.biz;

import java.util.List;

import net.sf.hibernate.HibernateException;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.gwt.base.client.biz.BPersistent;
import com.hd123.rumba.runtime.OperateContext;
import com.hd123.rumba.runtime.biz.IBManager;
import com.hd123.rumba.user.IUser;
import com.hd123.rumba.util.ClassifiedHashtable;

/**
 * 组织 | 业务层 | 管理员 | 接口类
 * 
 * @author lxm
 * 
 */
public interface IBOrganizationMgr extends IBManager {

  /**
   * 新建一个组织
   * 
   * @param upperOrgUuid
   *          指定上级组织的uuid，若传入null，表示创建顶级组织。
   * @return 创建的组织对象。
   * @throws BusinessException
   * @throws HibernateException
   */
  public BOrganization createOrganization(String upperOrgUuid) throws BusinessException,
      HibernateException;

  /**
   * 根据uuid载入组织。
   * 
   * @param uuid
   *          指定组织的uuid。
   * @return 载入的组织，若找不到，则返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public BOrganization loadOrganization(String uuid) throws BusinessException, HibernateException;

  /**
   * 保存组织。
   * 
   * @param org
   *          指定被保存的组织。
   * @param operator
   *          操作人。
   * @return 返回错误信息列表。
   * @throws BusinessException
   * @throws HibernateException
   * @deprecated
   */
  public ClassifiedHashtable saveOrganizationT(BOrganization org, IUser operator)
      throws BusinessException, HibernateException;

  /**
   * 保存组织。
   * 
   * @param org
   *          指定被保存的组织。
   * @param operate
   * @return 返回错误信息列表。
   * @throws BusinessException
   * @throws HibernateException
   */
  public ClassifiedHashtable saveOrganizationT(BOrganization org, OperateContext operate)
      throws BusinessException, HibernateException;

  /**
   * （标记）删除组织。
   * 
   * @param orgUuid
   *          指定被删除的组织的uuid。
   * @param operator
   *          操作人。
   * @param oca
   *          共享校验。
   * @return 是否删除成功。若组织已经被删除，则返回False。
   * @throws BusinessException
   * @throws HibernateException
   * @deprecated
   */
  public boolean deleteOrganizationT(String orgUuid, IUser operator, long oca)
      throws BusinessException, HibernateException;

  /**
   * （标记）删除组织。
   * 
   * @param orgUuid
   *          指定被删除的组织的uuid。
   * @param operate
   * @param oca
   *          共享校验。
   * @return 是否删除成功。若组织已经被删除，则返回False。
   * @throws BusinessException
   * @throws HibernateException
   */
  public boolean deleteOrganizationT(String orgUuid, OperateContext operate, long oca)
      throws BusinessException, HibernateException;

  /**
   * 恢复（标记）删除组织。
   * 
   * @param orgUuid
   *          指定被恢复删除的组织的uuid。
   * @param operator
   *          操作人。
   * @param oca
   *          共享校验。
   * @return 是否恢复删除成功。若组织已经被恢复删除，则返回False。
   * @throws BusinessException
   * @throws HibernateException
   * @deprecated
   */
  public boolean undeleteOrganizationT(String orgUuid, IUser operator, long oca)
      throws BusinessException, HibernateException;

  /**
   * 恢复（标记）删除组织。
   * 
   * @param orgUuid
   *          指定被恢复删除的组织的uuid。
   * @param operate
   * @param oca
   *          共享校验。
   * @return 是否恢复删除成功。若组织已经被恢复删除，则返回False。
   * @throws BusinessException
   * @throws HibernateException
   */
  public boolean undeleteOrganizationT(String orgUuid, OperateContext operate, long oca)
      throws BusinessException, HibernateException;

  /**
   * 根据uuid取得组织。
   * 
   * @param uuid
   *          指定查找组织的uuid。
   * @return 若找不到返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public SOrganization getOrganization(String uuid) throws BusinessException, HibernateException;

  /**
   * 根据uuid取得组织。
   * 
   * @param uuid
   *          指定查找组织的uuid。
   * @param bizClass
   *          指定业务层组织对象类型。
   * @return 若找不到返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public <T extends BPersistent> T getOrganization(String uuid, Class<T> bizClass)
      throws BusinessException, HibernateException;

  /**
   * 根据代码取得组织。
   * 
   * @param code
   *          指定查找组织的代码。
   * @return 若找不到返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public SOrganization getOrganizationByCode(String code) throws BusinessException,
      HibernateException;

  /**
   * 根据代码取得组织。
   * 
   * @param code
   *          指定查找组织的代码。
   * @param bizClass
   *          指定业务层组织对象类型。
   * @return 若找不到返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public <T extends BPersistent> T getOrganizationByCode(String code, Class<T> bizClass)
      throws BusinessException, HibernateException;

  /**
   * 根据组织域取得组织。
   * 
   * @param orgDomainUuid
   *          指定查找组织的组织域uuid。
   * @param bizClass
   *          指定业务层组织对象类型。
   * @return 若找不到返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public <T extends BPersistent> T getOrganizationByOrgDomain(String orgDomainUuid,
      Class<T> bizClass) throws BusinessException, HibernateException;

  /**
   * 取得指定组织的直接下级组织。
   * 
   * @param upperOrgUuid
   *          指定的上级组织uuid，若传入null，表示查找所有的顶级组织。
   * @return
   * @throws BusinessException
   * @throws HibernateException
   */
  public List<QOrganization> getLowerOrganizations(String upperOrgUuid) throws BusinessException,
      HibernateException;

  /**
   * 取得指定组织的下级组织数量。
   * 
   * @param upperOrgUuid
   *          指定的上级组织uuid，若传入null，表示查找所有的顶级组织。
   * @param direct
   *          是否只查询直接下级组织。
   * @return
   * @throws BusinessException
   * @throws HibernateException
   */
  public Integer getLowerOrganizationsCount(String upperOrgUuid, boolean direct)
      throws BusinessException, HibernateException;

  /**
   * 取得指定组织的所有上级组织。
   * 
   * @param orgUuid
   *          指定组织的uuid
   * @param bizClass
   *          指定业务层组织对象类型。
   * @return 上级组织列表，按照自上而下方式排列。
   * @throws BusinessException
   * @throws HibernateException
   */
  public <T extends BPersistent> List<T> getUpperOrganizations(String orgUuid, Class<T> bizClass)
      throws BusinessException, HibernateException;

  /**
   * 取得指定组织的兄弟组织数量。
   * 
   * @param orgUuid
   *          指定的组织uuid。
   * @return
   * @throws BusinessException
   * @throws HibernateException
   */
  public Integer getBrotherOrganizationsCount(String orgUuid) throws BusinessException,
      HibernateException;

  /**
   * 取得指定组织相对当前组织的位置。
   * 
   * @param currOrg
   *          当前组织。
   * @param org
   *          指定的组织。
   * @return 参见常量“VALUE_RELATIONSHIP_*”
   * @throws BusinessException
   */
  public int getRelativePosition(BOrganization currOrg, BOrganization org) throws BusinessException;

  /** 组织之间相对关系常量：自己 */
  public static final int VALUE_RELATIONSHIP_SELF = 1;
  /** 组织之间相对关系常量：下级域 */
  public static final int VALUE_RELATIONSHIP_LOWER = 2;
  /** 组织之间相对关系常量：上级域 */
  public static final int VALUE_RELATIONSHIP_UPPER = 3;
  /** 组织之间相对关系常量：兄弟域 */
  public static final int VALUE_RELATIONSHIP_BROTHER = 4;
  /** 组织之间相对关系常量：其它 */
  public static final int VALUE_RELATIONSHIP_OTHER = 0;

  /**
   * 取得指定组织的LevelId。
   * 
   * @param uuid
   *          指定组织的uuid。
   * @return 该组织的levelId。
   * @throws BusinessException
   * @throws HibernateException
   */
  public String getOrganizationLevelId(String uuid) throws BusinessException, HibernateException;

  /**
   * 取得指定组织的下级组织计数。
   * 
   * @param orgUuid
   *          指定组织的uuid。传入null，表示从顶级组织开始统计。
   * @param direct
   *          是否只统计直接下级组织。
   * @param states
   *          指定被统计的下级组织状态数组。若传入null，表示不约束状态。
   * @return 返回统计结果。
   * @throws BusinessException
   * @throws HibernateException
   */
  public Integer getCountOfChildren(String orgUuid, boolean direct, Integer[] states)
      throws BusinessException, HibernateException;
}
